Environment

library(Seurat)
Loading required package: SeuratObject
Loading required package: sp
‘SeuratObject’ was built under R 4.3.0 but the current version is 4.3.2; it is recomended that you reinstall ‘SeuratObject’ as the ABI for R
may have changed

Attaching package: ‘SeuratObject’

The following object is masked from ‘package:base’:

    intersect
library(tidyverse)
── Attaching core tidyverse packages ────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.4.4     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     ── Conflicts ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors

Read in Xenium

ipf3.xen <- LoadXenium('output-XETG00143__0020227__Region_1__20231214__022306/')
10X data contains more than one type and is being returned as a list containing matrices of each type.
|--------------------------------------------------|
|==================================================|
Warning: Feature names cannot have underscores ('_'), replacing with dashes ('-')Warning: Feature names cannot have underscores ('_'), replacing with dashes ('-')Warning: Feature names cannot have underscores ('_'), replacing with dashes ('-')Warning: Feature names cannot have underscores ('_'), replacing with dashes ('-')Warning: Feature names cannot have underscores ('_'), replacing with dashes ('-')Warning: Feature names cannot have underscores ('_'), replacing with dashes ('-')

General processing on 0020227

Filter

On the theory that if there was only few features, but they had counts, it is probably still interpretable.

ipf3.filtered.xen <- subset(ipf3.xen, subset=nCount_Xenium>20 & nFeature_Xenium>4)
Warning: Not validating FOV objectsWarning: Not validating Centroids objectsWarning: Not validating Centroids objectsWarning: Not validating FOV objectsWarning: Not validating Centroids objectsWarning: Not validating FOV objectsWarning: Not validating FOV objectsWarning: Not validating FOV objectsWarning: Not validating Seurat objects
print('original dataset:')
[1] "original dataset:"
print(ncol(ipf3.xen))
[1] 580730
print('filtered dataset:')
[1] "filtered dataset:"
print(ncol(ipf3.filtered.xen))
[1] 158303
# cleanup cleanup
rm(ipf3.xen)
gc()
             used    (Mb) gc trigger    (Mb)   max used    (Mb)
Ncells   12227670   653.1   85557660  4569.3  106947074  5711.6
Vcells 2224641624 16972.7 4452581310 33970.5 3805168063 29031.2

Standard Processing

DefaultAssay(ipf3.filtered.xen) <- 'Xenium'
ipf3.filtered.xen <- NormalizeData(ipf3.filtered.xen, verbose=F)
ipf3.filtered.xen <- FindVariableFeatures(ipf3.filtered.xen, verbose=F) # defaults to finding 2000, which would be all of them, but downstream expects this.
ipf3.filtered.xen <- ScaleData(ipf3.filtered.xen, verbose=F)
ipf3.filtered.xen <- RunPCA(ipf3.filtered.xen, npcs = 30, features = rownames(ipf3.xen), verbose=F)
Error: object 'ipf3.xen' not found

Modified Clustering

Modification to reduce cluster number. i think the sparsity of data means that pruned edges leads to more communities. Major change is the prune.SNN parameter.

ipf3.filtered.xen <- FindNeighbors(ipf3.filtered.xen, reduction='pca', dims=1:30, prune.SNN=0) 
Computing nearest neighbor graph
Computing SNN
ipf3.filtered.xen <- FindClusters(ipf3.filtered.xen, resolution = 0.6)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 158303
Number of edges: 34314140

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8555
Number of communities: 16
Elapsed time: 353 seconds
DimPlot(ipf3.filtered.xen, label=T)
Rasterizing points since number of points exceeds 100,000.
To disable this behavior set `raster=FALSE`

Proliferation (general)

10X core set includes: CCNA1, CCNB2, CDK1, CENPF, KIT, MKI67, PCNA, TOP2A.

FeaturePlot(ipf3.filtered.xen, features=c('COL1A1','CTHRC1','SCN7A','PLA2G2A'),
            min.cutoff='q25', max.cutoff='q90', order=T)
Rasterizing points since number of points exceeds 100,000.
To disable this behavior set `raster=FALSE`
Rasterizing points since number of points exceeds 100,000.
To disable this behavior set `raster=FALSE`
Rasterizing points since number of points exceeds 100,000.
To disable this behavior set `raster=FALSE`
Rasterizing points since number of points exceeds 100,000.
To disable this behavior set `raster=FALSE`

FeaturePlot(ipf3.filtered.xen, features=c('RGS5','MYH11','CNN1','SFRP2'),
            min.cutoff='q25', max.cutoff='q90', order=T)
Rasterizing points since number of points exceeds 100,000.
To disable this behavior set `raster=FALSE`
Rasterizing points since number of points exceeds 100,000.
To disable this behavior set `raster=FALSE`
Rasterizing points since number of points exceeds 100,000.
To disable this behavior set `raster=FALSE`
Rasterizing points since number of points exceeds 100,000.
To disable this behavior set `raster=FALSE`

FeaturePlot(ipf3.filtered.xen, features=c('CCNA1','CCNB2','CDK1','CENPF'),
            min.cutoff='q25', max.cutoff='q90', order=T)
Rasterizing points since number of points exceeds 100,000.
To disable this behavior set `raster=FALSE`
Rasterizing points since number of points exceeds 100,000.
To disable this behavior set `raster=FALSE`
Rasterizing points since number of points exceeds 100,000.
To disable this behavior set `raster=FALSE`
Rasterizing points since number of points exceeds 100,000.
To disable this behavior set `raster=FALSE`

FeaturePlot(ipf3.filtered.xen, features=c('KIT','MKI67','PCNA','TOP2A'),
            min.cutoff='q25', max.cutoff='q90', order=T)
Rasterizing points since number of points exceeds 100,000.
To disable this behavior set `raster=FALSE`
Rasterizing points since number of points exceeds 100,000.
To disable this behavior set `raster=FALSE`
Rasterizing points since number of points exceeds 100,000.
To disable this behavior set `raster=FALSE`
Rasterizing points since number of points exceeds 100,000.
To disable this behavior set `raster=FALSE`

p <- DotPlot(ipf3.filtered.xen, features=c('EPCAM','ITGB6',
                                           'COL1A1','CTHRC1','SCN7A','PLA2G2A','RGS5','MFAP5','PI16','MYH11','CNN1','SFRP2',
                                      'CCNA1','CCNB2','CDK1','CENPF','KIT','MKI67','PCNA','TOP2A'))
p + coord_flip() + scale_x_discrete(limits = rev)

ImageFeaturePlot(ipf3.filtered.xen, features=c('ARG1'),
            min.cutoff='q25', max.cutoff='q60', cols=c('white','red'))

ImageFeaturePlot(ipf3.filtered.xen, features=c('IL13'),
            min.cutoff='q25', max.cutoff='q60', cols=c('white','red'))

ImageFeaturePlot(ipf3.filtered.xen, features=c('IL6'),
            min.cutoff='q25', max.cutoff='q60', cols=c('white','red'))

Fibroblast subset

ipf3.fib.xen <- subset(ipf3.filtered.xen, idents=c(0,5,9,15))
Warning: Not validating FOV objectsWarning: Not validating Centroids objectsWarning: Not validating Centroids objectsWarning: Not validating FOV objectsWarning: Not validating Centroids objectsWarning: Not validating FOV objectsWarning: Not validating FOV objectsWarning: Not validating FOV objectsWarning: Not validating Seurat objects
DimPlot(ipf3.fib.xen, label=T)

As usual I think the cell cycle signal is strong enough that it forced all proliferative cells into cluster 15 across different cell types. Proceed and prune later. ## Recluster

ipf3.fib.xen <- NormalizeData(ipf3.fib.xen, verbose=F)
ipf3.fib.xen <- FindVariableFeatures(ipf3.fib.xen, verbose=F) # defaults to finding 2000, which would be all of them, but downstream expects this.
ipf3.fib.xen <- ScaleData(ipf3.fib.xen, verbose=F)
ipf3.fib.xen <- RunPCA(ipf3.fib.xen, npcs = 30, features = rownames(ipf3.filtered.xen), verbose=F)
ipf3.fib.xen <- RunUMAP(ipf3.fib.xen, dims = 1:30, verbose=F)
ipf3.fib.xen <- FindNeighbors(ipf3.fib.xen, reduction='pca', dims=1:30, prune.SNN=0) 
Computing nearest neighbor graph
Computing SNN
ipf3.fib.xen <- FindClusters(ipf3.fib.xen, resolution = 1)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 43496
Number of edges: 10770942

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.6781
Number of communities: 11
Elapsed time: 68 seconds
DimPlot(ipf3.fib.xen, label=T)

Those fucking proliferative cells, EPCAM+ and COL1+ lumped together in cluster 9. Really justifies why regression is useful. Try higher res first.

ipf3.fib.xen <- FindClusters(ipf3.fib.xen, resolution = 2)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 43496
Number of edges: 10770942

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.5693
Number of communities: 21
Elapsed time: 58 seconds
DimPlot(ipf3.fib.xen, label=T)

FeaturePlot(ipf3.fib.xen, features=c('EPCAM','ITGB6','ABCA3','KRT8'),
            min.cutoff='q25', max.cutoff='q90', order=T)

FeaturePlot(ipf3.fib.xen, features=c('COL1A1','CTHRC1','SCN7A','PLA2G2A'),
            min.cutoff='q25', max.cutoff='q90', order=T)

FeaturePlot(ipf3.fib.xen, features=c('RGS5','MYH11','CNN1','SFRP2'),
            min.cutoff='q25', max.cutoff='q90', order=T)

FeaturePlot(ipf3.fib.xen, features=c('CCNA1','CCNB2','CDK1','CENPF'),
            min.cutoff='q25', max.cutoff='q90', order=T)

FeaturePlot(ipf3.fib.xen, features=c('KIT','MKI67','PCNA','TOP2A'),
            min.cutoff='q25', max.cutoff='q90', order=T)

Whew. Drop cluster 19 and 7, these got roped in here probably because they are DATPs that express some collagen or proliferative epithelium. One is almost certainly AT2 (ABCA3/KRT8/ITGB6 positive) and the other is proliferative epithelial.

ipf3.fib.xen <- subset(x = ipf3.fib.xen, idents = c(7,19), invert = TRUE)
Warning: Not validating FOV objectsWarning: Not validating Centroids objectsWarning: Not validating Centroids objectsWarning: Not validating FOV objectsWarning: Not validating Centroids objectsWarning: Not validating FOV objectsWarning: Not validating FOV objectsWarning: Not validating FOV objectsWarning: Not validating Seurat objects

Recluster after pruning

ipf3.fib.xen <- NormalizeData(ipf3.fib.xen, verbose=F)
ipf3.fib.xen <- FindVariableFeatures(ipf3.fib.xen, verbose=F) # defaults to finding 2000, which would be all of them, but downstream expects this.
ipf3.fib.xen <- ScaleData(ipf3.fib.xen, verbose=F)
ipf3.fib.xen <- RunPCA(ipf3.fib.xen, npcs = 30, features = rownames(ipf3.filtered.xen), verbose=F)
ipf3.fib.xen <- RunUMAP(ipf3.fib.xen, dims = 1:30, verbose=F)
ipf3.fib.xen <- FindNeighbors(ipf3.fib.xen, reduction='pca', dims=1:30, prune.SNN=0, verbose=F) 
ipf3.fib.xen <- FindClusters(ipf3.fib.xen, resolution = 1.5, verbose=F)
DimPlot(ipf3.fib.xen, label=T)

FeaturePlot(ipf3.fib.xen, features=c('COL1A1','CTHRC1','POSTN','SCN7A'),
            min.cutoff='q25', max.cutoff='q90', order=T)

FeaturePlot(ipf3.fib.xen, features=c('INMT','RGS5','MYH11','CNN1'),
            min.cutoff='q25', max.cutoff='q90', order=T)

FeaturePlot(ipf3.fib.xen, features=c('SFRP2','PLA2G2A','MFAP5','PI16'),
            min.cutoff='q25', max.cutoff='q90', order=T)

FeaturePlot(ipf3.fib.xen, features=c('LGR5','WNT5A'),
            min.cutoff='q25', max.cutoff='q90', order=T)

FeaturePlot(ipf3.fib.xen, features=c('CCNA1','CCNB2','CDK1','CENPF'),
            min.cutoff='q25', max.cutoff='q90', order=T)

FeaturePlot(ipf3.fib.xen, features=c('KIT','MKI67','PCNA','TOP2A'),
            min.cutoff='q25', max.cutoff='q90', order=T)

FeaturePlot(ipf3.fib.xen, features=c('LTBP2','COL5A2','COL8A1','DPP6'),
            min.cutoff='q25', max.cutoff='q90', order=T)

FeaturePlot(ipf3.fib.xen, features=c('APOD','MFAP5','FBN1','FGFR4'),
            min.cutoff='q25', max.cutoff='q90', order=T)

FeaturePlot(ipf3.fib.xen, features=c('PCOLCE2','PDGFRA','SFRP2','SVEP1'),
            min.cutoff='q25', max.cutoff='q90', order=T)

FeaturePlot(ipf3.fib.xen, features=c('WNT2','MEDAG','PIM1','RARRES1'),
            min.cutoff='q25', max.cutoff='q90', order=T)

FeaturePlot(ipf3.fib.xen, features=c('THBS2'),
            min.cutoff='q25', max.cutoff='q90', order=T)

p <- DotPlot(ipf3.fib.xen, features=unique(c('EPCAM','ITGB6',
                                      'COL1A1','CTHRC1','POSTN','COL8A1','SCN7A','INMT','RGS5','MYH11','CNN1','SFRP2',
                                      'PLA2G2A','MFAP5','PI16','LGR5','WNT5A','CCNA1','CCNB2','CDK1','CENPF',
                                      'KIT','MKI67','PCNA','TOP2A','LTBP2','COL5A2','COL8A1','DPP6',
                                      'APOD','MFAP5','FBN1','FGFR4','PCOLCE2','PDGFRA','SFRP2','SVEP1',
                                      'WNT2','MEDAG','PIM1','RARRES1','THBS2'))
)
p + coord_flip() + scale_x_discrete(limits = rev)

ipf3.fib.xen <- RenameIdents(object = ipf3.fib.xen,
                             `0` = "SmoothMuscle",
                             `1` = "AlveolarFib",
                             `2` = "FibroticFib_CTHRC1low",
                             `3` = "Pericyte",
                             `4` = "LipoFib",
                             `5` = "SmoothMuscle",
                             `6` = "AlveolarFib",
                             `7` = "FibroticFib_CTHRC1high",
                             `9` = "ProliferatingFib",
                             `8` = "AdventitialFib",
                             `10` = "AlveolarFib",
                             `11` = "Pericyte",
                             `12` = "AlveolarFib",
                             `13` = "AlveolarFib"
                             )
DimPlot(ipf3.fib.xen, label=T)

Marker learning

On the theory that there might be hidden markers of utility in the Xenium probeset that we could co-opt for next cycle.

fib.markers <- FindAllMarkers(ipf3.fib.xen, only.pos=T)
Calculating cluster SmoothMuscle
For a (much!) faster implementation of the Wilcoxon Rank Sum Test,
(default method for FindMarkers) please install the presto package
--------------------------------------------
install.packages('devtools')
devtools::install_github('immunogenomics/presto')
--------------------------------------------
After installation of presto, Seurat will automatically use the more 
efficient implementation (no further action necessary).
This message will be shown once per session

  |                                                  | 0 % ~calculating  
  |++                                                | 3 % ~03s          
  |+++                                               | 5 % ~03s          
  |++++                                              | 8 % ~02s          
  |++++++                                            | 11% ~02s          
  |+++++++                                           | 13% ~02s          
  |++++++++                                          | 16% ~02s          
  |++++++++++                                        | 18% ~02s          
  |+++++++++++                                       | 21% ~02s          
  |++++++++++++                                      | 24% ~02s          
  |++++++++++++++                                    | 26% ~02s          
  |+++++++++++++++                                   | 29% ~02s          
  |++++++++++++++++                                  | 32% ~02s          
  |++++++++++++++++++                                | 34% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |++++++++++++++++++++                              | 39% ~01s          
  |++++++++++++++++++++++                            | 42% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
Calculating cluster AlveolarFib

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~09s          
  |++                                                | 3 % ~09s          
  |++                                                | 4 % ~09s          
  |+++                                               | 5 % ~09s          
  |++++                                              | 7 % ~09s          
  |++++                                              | 8 % ~09s          
  |+++++                                             | 9 % ~08s          
  |++++++                                            | 11% ~08s          
  |++++++                                            | 12% ~08s          
  |+++++++                                           | 13% ~08s          
  |++++++++                                          | 14% ~08s          
  |++++++++                                          | 16% ~08s          
  |+++++++++                                         | 17% ~08s          
  |++++++++++                                        | 18% ~08s          
  |++++++++++                                        | 20% ~07s          
  |+++++++++++                                       | 21% ~07s          
  |++++++++++++                                      | 22% ~07s          
  |++++++++++++                                      | 24% ~07s          
  |+++++++++++++                                     | 25% ~07s          
  |++++++++++++++                                    | 26% ~07s          
  |++++++++++++++                                    | 28% ~07s          
  |+++++++++++++++                                   | 29% ~07s          
  |++++++++++++++++                                  | 30% ~06s          
  |++++++++++++++++                                  | 32% ~06s          
  |+++++++++++++++++                                 | 33% ~06s          
  |++++++++++++++++++                                | 34% ~06s          
  |++++++++++++++++++                                | 36% ~06s          
  |+++++++++++++++++++                               | 37% ~06s          
  |++++++++++++++++++++                              | 38% ~06s          
  |++++++++++++++++++++                              | 39% ~06s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |++++++++++++++++++++++                            | 42% ~05s          
  |++++++++++++++++++++++                            | 43% ~05s          
  |+++++++++++++++++++++++                           | 45% ~05s          
  |++++++++++++++++++++++++                          | 46% ~05s          
  |++++++++++++++++++++++++                          | 47% ~05s          
  |+++++++++++++++++++++++++                         | 49% ~05s          
  |+++++++++++++++++++++++++                         | 50% ~05s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |+++++++++++++++++++++++++++                       | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |+++++++++++++++++++++++++++++                     | 57% ~04s          
  |+++++++++++++++++++++++++++++                     | 58% ~04s          
  |++++++++++++++++++++++++++++++                    | 59% ~04s          
  |+++++++++++++++++++++++++++++++                   | 61% ~04s          
  |+++++++++++++++++++++++++++++++                   | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=09s  
Calculating cluster FibroticFib_CTHRC1low

  |                                                  | 0 % ~calculating  
  |++                                                | 3 % ~02s          
  |+++                                               | 5 % ~02s          
  |++++                                              | 8 % ~02s          
  |++++++                                            | 11% ~02s          
  |+++++++                                           | 13% ~02s          
  |++++++++                                          | 16% ~02s          
  |++++++++++                                        | 18% ~02s          
  |+++++++++++                                       | 21% ~02s          
  |++++++++++++                                      | 24% ~02s          
  |++++++++++++++                                    | 26% ~02s          
  |+++++++++++++++                                   | 29% ~02s          
  |++++++++++++++++                                  | 32% ~02s          
  |++++++++++++++++++                                | 34% ~01s          
  |+++++++++++++++++++                               | 37% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |++++++++++++++++++++++                            | 42% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
Calculating cluster Pericyte

  |                                                  | 0 % ~calculating  
  |+                                                 | 2 % ~06s          
  |++                                                | 4 % ~06s          
  |+++                                               | 6 % ~06s          
  |++++                                              | 7 % ~06s          
  |+++++                                             | 9 % ~06s          
  |++++++                                            | 11% ~06s          
  |+++++++                                           | 13% ~05s          
  |++++++++                                          | 15% ~05s          
  |+++++++++                                         | 17% ~05s          
  |++++++++++                                        | 19% ~05s          
  |+++++++++++                                       | 20% ~05s          
  |++++++++++++                                      | 22% ~05s          
  |+++++++++++++                                     | 24% ~05s          
  |+++++++++++++                                     | 26% ~05s          
  |++++++++++++++                                    | 28% ~05s          
  |+++++++++++++++                                   | 30% ~04s          
  |++++++++++++++++                                  | 31% ~04s          
  |+++++++++++++++++                                 | 33% ~04s          
  |++++++++++++++++++                                | 35% ~04s          
  |+++++++++++++++++++                               | 37% ~04s          
  |++++++++++++++++++++                              | 39% ~04s          
  |+++++++++++++++++++++                             | 41% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |+++++++++++++++++++++++                           | 44% ~03s          
  |++++++++++++++++++++++++                          | 46% ~03s          
  |+++++++++++++++++++++++++                         | 48% ~03s          
  |+++++++++++++++++++++++++                         | 50% ~03s          
  |++++++++++++++++++++++++++                        | 52% ~03s          
  |+++++++++++++++++++++++++++                       | 54% ~03s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~02s          
  |++++++++++++++++++++++++++++++++                  | 63% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=06s  
Calculating cluster LipoFib

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~05s          
  |++                                                | 2 % ~05s          
  |++                                                | 4 % ~05s          
  |+++                                               | 5 % ~05s          
  |+++                                               | 6 % ~05s          
  |++++                                              | 7 % ~05s          
  |+++++                                             | 8 % ~05s          
  |+++++                                             | 9 % ~04s          
  |++++++                                            | 11% ~04s          
  |++++++                                            | 12% ~04s          
  |+++++++                                           | 13% ~04s          
  |++++++++                                          | 14% ~04s          
  |++++++++                                          | 15% ~04s          
  |+++++++++                                         | 16% ~04s          
  |+++++++++                                         | 18% ~04s          
  |++++++++++                                        | 19% ~04s          
  |++++++++++                                        | 20% ~04s          
  |+++++++++++                                       | 21% ~04s          
  |++++++++++++                                      | 22% ~04s          
  |++++++++++++                                      | 24% ~04s          
  |+++++++++++++                                     | 25% ~04s          
  |+++++++++++++                                     | 26% ~04s          
  |++++++++++++++                                    | 27% ~04s          
  |+++++++++++++++                                   | 28% ~04s          
  |+++++++++++++++                                   | 29% ~04s          
  |++++++++++++++++                                  | 31% ~03s          
  |++++++++++++++++                                  | 32% ~03s          
  |+++++++++++++++++                                 | 33% ~03s          
  |++++++++++++++++++                                | 34% ~03s          
  |++++++++++++++++++                                | 35% ~03s          
  |+++++++++++++++++++                               | 36% ~03s          
  |+++++++++++++++++++                               | 38% ~03s          
  |++++++++++++++++++++                              | 39% ~03s          
  |++++++++++++++++++++                              | 40% ~03s          
  |+++++++++++++++++++++                             | 41% ~03s          
  |++++++++++++++++++++++                            | 42% ~03s          
  |++++++++++++++++++++++                            | 44% ~03s          
  |+++++++++++++++++++++++                           | 45% ~03s          
  |+++++++++++++++++++++++                           | 46% ~03s          
  |++++++++++++++++++++++++                          | 47% ~03s          
  |+++++++++++++++++++++++++                         | 48% ~03s          
  |+++++++++++++++++++++++++                         | 49% ~03s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |++++++++++++++++++++++++++                        | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |++++++++++++++++++++++++++++                      | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |+++++++++++++++++++++++++++++                     | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 58% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |++++++++++++++++++++++++++++++                    | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 61% ~02s          
  |++++++++++++++++++++++++++++++++                  | 62% ~02s          
  |++++++++++++++++++++++++++++++++                  | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=05s  
Calculating cluster FibroticFib_CTHRC1high

  |                                                  | 0 % ~calculating  
  |++                                                | 3 % ~02s          
  |+++                                               | 6 % ~02s          
  |+++++                                             | 8 % ~02s          
  |++++++                                            | 11% ~02s          
  |+++++++                                           | 14% ~02s          
  |+++++++++                                         | 17% ~02s          
  |++++++++++                                        | 19% ~02s          
  |++++++++++++                                      | 22% ~02s          
  |+++++++++++++                                     | 25% ~02s          
  |++++++++++++++                                    | 28% ~02s          
  |++++++++++++++++                                  | 31% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |+++++++++++++++++++                               | 36% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |+++++++++++++++++++++                             | 42% ~01s          
  |+++++++++++++++++++++++                           | 44% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |++++++++++++++++++++++++++++++                    | 58% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
Calculating cluster ProliferatingFib

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~08s          
  |++                                                | 3 % ~08s          
  |+++                                               | 4 % ~08s          
  |+++                                               | 5 % ~08s          
  |++++                                              | 7 % ~08s          
  |+++++                                             | 8 % ~08s          
  |+++++                                             | 9 % ~08s          
  |++++++                                            | 11% ~08s          
  |+++++++                                           | 12% ~08s          
  |+++++++                                           | 14% ~07s          
  |++++++++                                          | 15% ~07s          
  |+++++++++                                         | 16% ~07s          
  |+++++++++                                         | 18% ~07s          
  |++++++++++                                        | 19% ~07s          
  |+++++++++++                                       | 20% ~07s          
  |+++++++++++                                       | 22% ~07s          
  |++++++++++++                                      | 23% ~07s          
  |+++++++++++++                                     | 24% ~07s          
  |+++++++++++++                                     | 26% ~06s          
  |++++++++++++++                                    | 27% ~06s          
  |+++++++++++++++                                   | 28% ~06s          
  |+++++++++++++++                                   | 30% ~06s          
  |++++++++++++++++                                  | 31% ~06s          
  |+++++++++++++++++                                 | 32% ~06s          
  |+++++++++++++++++                                 | 34% ~06s          
  |++++++++++++++++++                                | 35% ~06s          
  |+++++++++++++++++++                               | 36% ~05s          
  |+++++++++++++++++++                               | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~05s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |+++++++++++++++++++++                             | 42% ~05s          
  |++++++++++++++++++++++                            | 43% ~05s          
  |+++++++++++++++++++++++                           | 45% ~05s          
  |+++++++++++++++++++++++                           | 46% ~05s          
  |++++++++++++++++++++++++                          | 47% ~05s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |+++++++++++++++++++++++++                         | 50% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |++++++++++++++++++++++++++++                      | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |+++++++++++++++++++++++++++++                     | 57% ~04s          
  |++++++++++++++++++++++++++++++                    | 58% ~04s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |++++++++++++++++++++++++++++++++                  | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |++++++++++++++++++++++++++++++++++                | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=09s  
Calculating cluster AdventitialFib

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~05s          
  |++                                                | 2 % ~05s          
  |++                                                | 3 % ~05s          
  |+++                                               | 4 % ~05s          
  |+++                                               | 5 % ~05s          
  |++++                                              | 7 % ~05s          
  |++++                                              | 8 % ~05s          
  |+++++                                             | 9 % ~05s          
  |+++++                                             | 10% ~05s          
  |++++++                                            | 11% ~05s          
  |+++++++                                           | 12% ~05s          
  |+++++++                                           | 13% ~05s          
  |++++++++                                          | 14% ~05s          
  |++++++++                                          | 15% ~05s          
  |+++++++++                                         | 16% ~05s          
  |+++++++++                                         | 18% ~04s          
  |++++++++++                                        | 19% ~04s          
  |++++++++++                                        | 20% ~04s          
  |+++++++++++                                       | 21% ~04s          
  |+++++++++++                                       | 22% ~04s          
  |++++++++++++                                      | 23% ~04s          
  |+++++++++++++                                     | 24% ~04s          
  |+++++++++++++                                     | 25% ~04s          
  |++++++++++++++                                    | 26% ~04s          
  |++++++++++++++                                    | 27% ~04s          
  |+++++++++++++++                                   | 29% ~04s          
  |+++++++++++++++                                   | 30% ~04s          
  |++++++++++++++++                                  | 31% ~04s          
  |++++++++++++++++                                  | 32% ~04s          
  |+++++++++++++++++                                 | 33% ~04s          
  |++++++++++++++++++                                | 34% ~04s          
  |++++++++++++++++++                                | 35% ~04s          
  |+++++++++++++++++++                               | 36% ~03s          
  |+++++++++++++++++++                               | 37% ~03s          
  |++++++++++++++++++++                              | 38% ~03s          
  |++++++++++++++++++++                              | 40% ~03s          
  |+++++++++++++++++++++                             | 41% ~03s          
  |+++++++++++++++++++++                             | 42% ~03s          
  |++++++++++++++++++++++                            | 43% ~03s          
  |++++++++++++++++++++++                            | 44% ~03s          
  |+++++++++++++++++++++++                           | 45% ~03s          
  |++++++++++++++++++++++++                          | 46% ~03s          
  |++++++++++++++++++++++++                          | 47% ~03s          
  |+++++++++++++++++++++++++                         | 48% ~03s          
  |+++++++++++++++++++++++++                         | 49% ~03s          
  |++++++++++++++++++++++++++                        | 51% ~03s          
  |++++++++++++++++++++++++++                        | 52% ~03s          
  |+++++++++++++++++++++++++++                       | 53% ~03s          
  |+++++++++++++++++++++++++++                       | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |+++++++++++++++++++++++++++++                     | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |++++++++++++++++++++++++++++++                    | 58% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |+++++++++++++++++++++++++++++++                   | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 62% ~02s          
  |++++++++++++++++++++++++++++++++                  | 63% ~02s          
  |++++++++++++++++++++++++++++++++                  | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=05s  
fib.markers %>% group_by(cluster) %>% slice_head(n=10) %>% ungroup() -> top10
top10
# manually save this
p1 <- DoHeatmap(ipf3.fib.xen, features = top10$gene) + NoLegend()
ggsave('forChris-proliferation-on-0020227_files/figure-gfm/markers-heatmap.png', units='in', width=9, height=7)

Generate assignments file for Xenium Explorer

For version 1.2.0, the instructons say:

“Visualize custom cells groups in Xenium Explorer by importing a CSV file specifying cell ids and corresponding group names. Build a CSV file containing each cell id in the first column and the group the cell should be assigned to in the second column. A cell may only be assigned to one group. Not all cells in the dataset need to be included.

Ensure the columns have headers named “cell_id” and “group”.”

This is basically the named_clusters list with a header and saved as a CSV.

scratch <- tibble(cell_id = names(ipf3.fib.xen$named_clusters),
                      group = ipf3.fib.xen$named_clusters)
write.csv(scratch, 'Seurat_fib_named_clusters.csv')
LS0tCnRpdGxlOiAiUHJvbGlmZXJhdGluZyBmaWJyb2JsYXN0cyBvbiAwMDIwMjI3IGZvciBDaHJpcyIKb3V0cHV0OiAKICBnaXRodWJfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCi0tLQojIEVudmlyb25tZW50CmBgYHtyfQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeSh0aWR5dmVyc2UpCmBgYAojIyBSZWFkIGluIFhlbml1bSAKYGBge3J9CmlwZjMueGVuIDwtIExvYWRYZW5pdW0oJ291dHB1dC1YRVRHMDAxNDNfXzAwMjAyMjdfX1JlZ2lvbl8xX18yMDIzMTIxNF9fMDIyMzA2LycpCmBgYAojIEdlbmVyYWwgcHJvY2Vzc2luZyBvbiAwMDIwMjI3IAojIyBGaWx0ZXIKT24gdGhlIHRoZW9yeSB0aGF0IGlmIHRoZXJlIHdhcyBvbmx5IGZldyBmZWF0dXJlcywgYnV0IHRoZXkgaGFkIGNvdW50cywgaXQgaXMgcHJvYmFibHkgc3RpbGwgaW50ZXJwcmV0YWJsZS4KYGBge3J9CmlwZjMuZmlsdGVyZWQueGVuIDwtIHN1YnNldChpcGYzLnhlbiwgc3Vic2V0PW5Db3VudF9YZW5pdW0+MjAgJiBuRmVhdHVyZV9YZW5pdW0+NCkKYGBgCmBgYHtyfQpwcmludCgnb3JpZ2luYWwgZGF0YXNldDonKQpwcmludChuY29sKGlwZjMueGVuKSkKcHJpbnQoJ2ZpbHRlcmVkIGRhdGFzZXQ6JykKcHJpbnQobmNvbChpcGYzLmZpbHRlcmVkLnhlbikpCmBgYApgYGB7cn0KIyBjbGVhbnVwIGNsZWFudXAKcm0oaXBmMy54ZW4pCmdjKCkKYGBgCgojIyBTdGFuZGFyZCBQcm9jZXNzaW5nCmBgYHtyfQpEZWZhdWx0QXNzYXkoaXBmMy5maWx0ZXJlZC54ZW4pIDwtICdYZW5pdW0nCmlwZjMuZmlsdGVyZWQueGVuIDwtIE5vcm1hbGl6ZURhdGEoaXBmMy5maWx0ZXJlZC54ZW4sIHZlcmJvc2U9RikKaXBmMy5maWx0ZXJlZC54ZW4gPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoaXBmMy5maWx0ZXJlZC54ZW4sIHZlcmJvc2U9RikgIyBkZWZhdWx0cyB0byBmaW5kaW5nIDIwMDAsIHdoaWNoIHdvdWxkIGJlIGFsbCBvZiB0aGVtLCBidXQgZG93bnN0cmVhbSBleHBlY3RzIHRoaXMuCmlwZjMuZmlsdGVyZWQueGVuIDwtIFNjYWxlRGF0YShpcGYzLmZpbHRlcmVkLnhlbiwgdmVyYm9zZT1GKQppcGYzLmZpbHRlcmVkLnhlbiA8LSBSdW5QQ0EoaXBmMy5maWx0ZXJlZC54ZW4sIG5wY3MgPSAzMCwgZmVhdHVyZXMgPSByb3duYW1lcyhpcGYzLmZpbHRlcmVkLnhlbiksIHZlcmJvc2U9RikKaXBmMy5maWx0ZXJlZC54ZW4gPC0gUnVuVU1BUChpcGYzLmZpbHRlcmVkLnhlbiwgZGltcyA9IDE6MzAsIHZlcmJvc2U9RikKYGBgCiMjIE1vZGlmaWVkIENsdXN0ZXJpbmcKTW9kaWZpY2F0aW9uIHRvIHJlZHVjZSBjbHVzdGVyIG51bWJlci4gaSB0aGluayB0aGUgc3BhcnNpdHkgb2YgZGF0YSBtZWFucyB0aGF0IHBydW5lZCBlZGdlcyBsZWFkcyB0byBtb3JlIGNvbW11bml0aWVzLiBNYWpvciBjaGFuZ2UgaXMgdGhlIHBydW5lLlNOTiBwYXJhbWV0ZXIuCmBgYHtyfQppcGYzLmZpbHRlcmVkLnhlbiA8LSBGaW5kTmVpZ2hib3JzKGlwZjMuZmlsdGVyZWQueGVuLCByZWR1Y3Rpb249J3BjYScsIGRpbXM9MTozMCwgcHJ1bmUuU05OPTApIAppcGYzLmZpbHRlcmVkLnhlbiA8LSBGaW5kQ2x1c3RlcnMoaXBmMy5maWx0ZXJlZC54ZW4sIHJlc29sdXRpb24gPSAwLjYpCmBgYApgYGB7cn0KRGltUGxvdChpcGYzLmZpbHRlcmVkLnhlbiwgbGFiZWw9VCkKYGBgCiMgUHJvbGlmZXJhdGlvbiAoZ2VuZXJhbCkKMTBYIGNvcmUgc2V0IGluY2x1ZGVzOiBDQ05BMSwgQ0NOQjIsIENESzEsIENFTlBGLCBLSVQsIE1LSTY3LCBQQ05BLCBUT1AyQS4KYGBge3J9CkZlYXR1cmVQbG90KGlwZjMuZmlsdGVyZWQueGVuLCBmZWF0dXJlcz1jKCdDT0wxQTEnLCdDVEhSQzEnLCdTQ043QScsJ1BMQTJHMkEnKSwKICAgICAgICAgICAgbWluLmN1dG9mZj0ncTI1JywgbWF4LmN1dG9mZj0ncTkwJywgb3JkZXI9VCkKRmVhdHVyZVBsb3QoaXBmMy5maWx0ZXJlZC54ZW4sIGZlYXR1cmVzPWMoJ1JHUzUnLCdNWUgxMScsJ0NOTjEnLCdTRlJQMicpLAogICAgICAgICAgICBtaW4uY3V0b2ZmPSdxMjUnLCBtYXguY3V0b2ZmPSdxOTAnLCBvcmRlcj1UKQpGZWF0dXJlUGxvdChpcGYzLmZpbHRlcmVkLnhlbiwgZmVhdHVyZXM9YygnQ0NOQTEnLCdDQ05CMicsJ0NESzEnLCdDRU5QRicpLAogICAgICAgICAgICBtaW4uY3V0b2ZmPSdxMjUnLCBtYXguY3V0b2ZmPSdxOTAnLCBvcmRlcj1UKQpGZWF0dXJlUGxvdChpcGYzLmZpbHRlcmVkLnhlbiwgZmVhdHVyZXM9YygnS0lUJywnTUtJNjcnLCdQQ05BJywnVE9QMkEnKSwKICAgICAgICAgICAgbWluLmN1dG9mZj0ncTI1JywgbWF4LmN1dG9mZj0ncTkwJywgb3JkZXI9VCkKYGBgCmBgYHtyfQpwIDwtIERvdFBsb3QoaXBmMy5maWx0ZXJlZC54ZW4sIGZlYXR1cmVzPWMoJ0VQQ0FNJywnSVRHQjYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NPTDFBMScsJ0NUSFJDMScsJ1NDTjdBJywnUExBMkcyQScsJ1JHUzUnLCdNRkFQNScsJ1BJMTYnLCdNWUgxMScsJ0NOTjEnLCdTRlJQMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NDTkExJywnQ0NOQjInLCdDREsxJywnQ0VOUEYnLCdLSVQnLCdNS0k2NycsJ1BDTkEnLCdUT1AyQScpKQpwICsgY29vcmRfZmxpcCgpICsgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSByZXYpCmBgYApgYGB7cn0KSW1hZ2VGZWF0dXJlUGxvdChpcGYzLmZpbHRlcmVkLnhlbiwgZmVhdHVyZXM9YygnQVJHMScpLAogICAgICAgICAgICBtaW4uY3V0b2ZmPSdxMjUnLCBtYXguY3V0b2ZmPSdxNjAnLCBjb2xzPWMoJ3doaXRlJywncmVkJykpCkltYWdlRmVhdHVyZVBsb3QoaXBmMy5maWx0ZXJlZC54ZW4sIGZlYXR1cmVzPWMoJ0lMMTMnKSwKICAgICAgICAgICAgbWluLmN1dG9mZj0ncTI1JywgbWF4LmN1dG9mZj0ncTYwJywgY29scz1jKCd3aGl0ZScsJ3JlZCcpKQpJbWFnZUZlYXR1cmVQbG90KGlwZjMuZmlsdGVyZWQueGVuLCBmZWF0dXJlcz1jKCdJTDYnKSwKICAgICAgICAgICAgbWluLmN1dG9mZj0ncTI1JywgbWF4LmN1dG9mZj0ncTYwJywgY29scz1jKCd3aGl0ZScsJ3JlZCcpKQpgYGAKIyBGaWJyb2JsYXN0IHN1YnNldApgYGB7cn0KaXBmMy5maWIueGVuIDwtIHN1YnNldChpcGYzLmZpbHRlcmVkLnhlbiwgaWRlbnRzPWMoMCw1LDksMTUpKQpEaW1QbG90KGlwZjMuZmliLnhlbiwgbGFiZWw9VCkKYGBgCkFzIHVzdWFsIEkgdGhpbmsgdGhlIGNlbGwgY3ljbGUgc2lnbmFsIGlzIHN0cm9uZyBlbm91Z2ggdGhhdCBpdCBmb3JjZWQgYWxsIHByb2xpZmVyYXRpdmUgY2VsbHMgaW50byBjbHVzdGVyIDE1IGFjcm9zcyBkaWZmZXJlbnQgY2VsbCB0eXBlcy4gUHJvY2VlZCBhbmQgcHJ1bmUgbGF0ZXIuCiMjIFJlY2x1c3RlcgpgYGB7cn0KaXBmMy5maWIueGVuIDwtIE5vcm1hbGl6ZURhdGEoaXBmMy5maWIueGVuLCB2ZXJib3NlPUYpCmlwZjMuZmliLnhlbiA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhpcGYzLmZpYi54ZW4sIHZlcmJvc2U9RikgIyBkZWZhdWx0cyB0byBmaW5kaW5nIDIwMDAsIHdoaWNoIHdvdWxkIGJlIGFsbCBvZiB0aGVtLCBidXQgZG93bnN0cmVhbSBleHBlY3RzIHRoaXMuCmlwZjMuZmliLnhlbiA8LSBTY2FsZURhdGEoaXBmMy5maWIueGVuLCB2ZXJib3NlPUYpCmlwZjMuZmliLnhlbiA8LSBSdW5QQ0EoaXBmMy5maWIueGVuLCBucGNzID0gMzAsIGZlYXR1cmVzID0gcm93bmFtZXMoaXBmMy5maWx0ZXJlZC54ZW4pLCB2ZXJib3NlPUYpCmlwZjMuZmliLnhlbiA8LSBSdW5VTUFQKGlwZjMuZmliLnhlbiwgZGltcyA9IDE6MzAsIHZlcmJvc2U9RikKYGBgCmBgYHtyfQppcGYzLmZpYi54ZW4gPC0gRmluZE5laWdoYm9ycyhpcGYzLmZpYi54ZW4sIHJlZHVjdGlvbj0ncGNhJywgZGltcz0xOjMwLCBwcnVuZS5TTk49MCkgCmlwZjMuZmliLnhlbiA8LSBGaW5kQ2x1c3RlcnMoaXBmMy5maWIueGVuLCByZXNvbHV0aW9uID0gMSkKYGBgCmBgYHtyfQpEaW1QbG90KGlwZjMuZmliLnhlbiwgbGFiZWw9VCkKYGBgClRob3NlIGZ1Y2tpbmcgcHJvbGlmZXJhdGl2ZSBjZWxscywgRVBDQU0rIGFuZCBDT0wxKyBsdW1wZWQgdG9nZXRoZXIgaW4gY2x1c3RlciA5LiBSZWFsbHkganVzdGlmaWVzIHdoeSByZWdyZXNzaW9uIGlzIHVzZWZ1bC4gVHJ5IGhpZ2hlciByZXMgZmlyc3QuCmBgYHtyfQppcGYzLmZpYi54ZW4gPC0gRmluZENsdXN0ZXJzKGlwZjMuZmliLnhlbiwgcmVzb2x1dGlvbiA9IDIpCkRpbVBsb3QoaXBmMy5maWIueGVuLCBsYWJlbD1UKQpgYGAKCgpgYGB7cn0KRmVhdHVyZVBsb3QoaXBmMy5maWIueGVuLCBmZWF0dXJlcz1jKCdFUENBTScsJ0lUR0I2JywnQUJDQTMnLCdJTk1UJyksCiAgICAgICAgICAgIG1pbi5jdXRvZmY9J3EyNScsIG1heC5jdXRvZmY9J3E5MCcsIG9yZGVyPVQpCkZlYXR1cmVQbG90KGlwZjMuZmliLnhlbiwgZmVhdHVyZXM9YygnQ09MMUExJywnQ1RIUkMxJywnU0NON0EnLCdQTEEyRzJBJyksCiAgICAgICAgICAgIG1pbi5jdXRvZmY9J3EyNScsIG1heC5jdXRvZmY9J3E5MCcsIG9yZGVyPVQpCkZlYXR1cmVQbG90KGlwZjMuZmliLnhlbiwgZmVhdHVyZXM9YygnUkdTNScsJ01ZSDExJywnQ05OMScsJ1NGUlAyJyksCiAgICAgICAgICAgIG1pbi5jdXRvZmY9J3EyNScsIG1heC5jdXRvZmY9J3E5MCcsIG9yZGVyPVQpCkZlYXR1cmVQbG90KGlwZjMuZmliLnhlbiwgZmVhdHVyZXM9YygnQ0NOQTEnLCdDQ05CMicsJ0NESzEnLCdDRU5QRicpLAogICAgICAgICAgICBtaW4uY3V0b2ZmPSdxMjUnLCBtYXguY3V0b2ZmPSdxOTAnLCBvcmRlcj1UKQpGZWF0dXJlUGxvdChpcGYzLmZpYi54ZW4sIGZlYXR1cmVzPWMoJ0tJVCcsJ01LSTY3JywnUENOQScsJ1RPUDJBJyksCiAgICAgICAgICAgIG1pbi5jdXRvZmY9J3EyNScsIG1heC5jdXRvZmY9J3E5MCcsIG9yZGVyPVQpCmBgYApXaGV3LiBEcm9wIGNsdXN0ZXIgMTkgYW5kIDcsIHRoZXNlIGdvdCByb3BlZCBpbiBoZXJlIHByb2JhYmx5IGJlY2F1c2UgdGhleSBhcmUgREFUUHMgdGhhdCBleHByZXNzIHNvbWUgY29sbGFnZW4gb3IgcHJvbGlmZXJhdGl2ZSBlcGl0aGVsaXVtLiBPbmUgaXMgYWxtb3N0IGNlcnRhaW5seSBBVDIgKEFCQ0EzL0tSVDgvSVRHQjYgcG9zaXRpdmUpIGFuZCB0aGUgb3RoZXIgaXMgcHJvbGlmZXJhdGl2ZSBlcGl0aGVsaWFsLiAKCmBgYHtyfQppcGYzLmZpYi54ZW4gPC0gc3Vic2V0KHggPSBpcGYzLmZpYi54ZW4sIGlkZW50cyA9IGMoNywxOSksIGludmVydCA9IFRSVUUpCmBgYAojIyBSZWNsdXN0ZXIgYWZ0ZXIgcHJ1bmluZwpgYGB7cn0KaXBmMy5maWIueGVuIDwtIE5vcm1hbGl6ZURhdGEoaXBmMy5maWIueGVuLCB2ZXJib3NlPUYpCmlwZjMuZmliLnhlbiA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhpcGYzLmZpYi54ZW4sIHZlcmJvc2U9RikgIyBkZWZhdWx0cyB0byBmaW5kaW5nIDIwMDAsIHdoaWNoIHdvdWxkIGJlIGFsbCBvZiB0aGVtLCBidXQgZG93bnN0cmVhbSBleHBlY3RzIHRoaXMuCmlwZjMuZmliLnhlbiA8LSBTY2FsZURhdGEoaXBmMy5maWIueGVuLCB2ZXJib3NlPUYpCmlwZjMuZmliLnhlbiA8LSBSdW5QQ0EoaXBmMy5maWIueGVuLCBucGNzID0gMzAsIGZlYXR1cmVzID0gcm93bmFtZXMoaXBmMy5maWx0ZXJlZC54ZW4pLCB2ZXJib3NlPUYpCmlwZjMuZmliLnhlbiA8LSBSdW5VTUFQKGlwZjMuZmliLnhlbiwgZGltcyA9IDE6MzAsIHZlcmJvc2U9RikKYGBgCmBgYHtyfQppcGYzLmZpYi54ZW4gPC0gRmluZE5laWdoYm9ycyhpcGYzLmZpYi54ZW4sIHJlZHVjdGlvbj0ncGNhJywgZGltcz0xOjMwLCBwcnVuZS5TTk49MCwgdmVyYm9zZT1GKSAKaXBmMy5maWIueGVuIDwtIEZpbmRDbHVzdGVycyhpcGYzLmZpYi54ZW4sIHJlc29sdXRpb24gPSAxLjUsIHZlcmJvc2U9RikKYGBgCmBgYHtyfQpEaW1QbG90KGlwZjMuZmliLnhlbiwgbGFiZWw9VCkKYGBgCmBgYHtyfQpGZWF0dXJlUGxvdChpcGYzLmZpYi54ZW4sIGZlYXR1cmVzPWMoJ0NPTDFBMScsJ0NUSFJDMScsJ1BPU1ROJywnU0NON0EnKSwKICAgICAgICAgICAgbWluLmN1dG9mZj0ncTI1JywgbWF4LmN1dG9mZj0ncTkwJywgb3JkZXI9VCkKRmVhdHVyZVBsb3QoaXBmMy5maWIueGVuLCBmZWF0dXJlcz1jKCdJTk1UJywnUkdTNScsJ01ZSDExJywnQ05OMScpLAogICAgICAgICAgICBtaW4uY3V0b2ZmPSdxMjUnLCBtYXguY3V0b2ZmPSdxOTAnLCBvcmRlcj1UKQpGZWF0dXJlUGxvdChpcGYzLmZpYi54ZW4sIGZlYXR1cmVzPWMoJ1NGUlAyJywnUExBMkcyQScsJ01GQVA1JywnUEkxNicpLAogICAgICAgICAgICBtaW4uY3V0b2ZmPSdxMjUnLCBtYXguY3V0b2ZmPSdxOTAnLCBvcmRlcj1UKQpGZWF0dXJlUGxvdChpcGYzLmZpYi54ZW4sIGZlYXR1cmVzPWMoJ0xHUjUnLCdXTlQ1QScpLAogICAgICAgICAgICBtaW4uY3V0b2ZmPSdxMjUnLCBtYXguY3V0b2ZmPSdxOTAnLCBvcmRlcj1UKQpGZWF0dXJlUGxvdChpcGYzLmZpYi54ZW4sIGZlYXR1cmVzPWMoJ0NDTkExJywnQ0NOQjInLCdDREsxJywnQ0VOUEYnKSwKICAgICAgICAgICAgbWluLmN1dG9mZj0ncTI1JywgbWF4LmN1dG9mZj0ncTkwJywgb3JkZXI9VCkKRmVhdHVyZVBsb3QoaXBmMy5maWIueGVuLCBmZWF0dXJlcz1jKCdLSVQnLCdNS0k2NycsJ1BDTkEnLCdUT1AyQScpLAogICAgICAgICAgICBtaW4uY3V0b2ZmPSdxMjUnLCBtYXguY3V0b2ZmPSdxOTAnLCBvcmRlcj1UKQpGZWF0dXJlUGxvdChpcGYzLmZpYi54ZW4sIGZlYXR1cmVzPWMoJ0xUQlAyJywnQ09MNUEyJywnQ09MOEExJywnRFBQNicpLAogICAgICAgICAgICBtaW4uY3V0b2ZmPSdxMjUnLCBtYXguY3V0b2ZmPSdxOTAnLCBvcmRlcj1UKQpGZWF0dXJlUGxvdChpcGYzLmZpYi54ZW4sIGZlYXR1cmVzPWMoJ0FQT0QnLCdNRkFQNScsJ0ZCTjEnLCdGR0ZSNCcpLAogICAgICAgICAgICBtaW4uY3V0b2ZmPSdxMjUnLCBtYXguY3V0b2ZmPSdxOTAnLCBvcmRlcj1UKQpGZWF0dXJlUGxvdChpcGYzLmZpYi54ZW4sIGZlYXR1cmVzPWMoJ1BDT0xDRTInLCdQREdGUkEnLCdTRlJQMicsJ1NWRVAxJyksCiAgICAgICAgICAgIG1pbi5jdXRvZmY9J3EyNScsIG1heC5jdXRvZmY9J3E5MCcsIG9yZGVyPVQpCkZlYXR1cmVQbG90KGlwZjMuZmliLnhlbiwgZmVhdHVyZXM9YygnV05UMicsJ01FREFHJywnUElNMScsJ1JBUlJFUzEnKSwKICAgICAgICAgICAgbWluLmN1dG9mZj0ncTI1JywgbWF4LmN1dG9mZj0ncTkwJywgb3JkZXI9VCkKRmVhdHVyZVBsb3QoaXBmMy5maWIueGVuLCBmZWF0dXJlcz1jKCdUSEJTMicpLAogICAgICAgICAgICBtaW4uY3V0b2ZmPSdxMjUnLCBtYXguY3V0b2ZmPSdxOTAnLCBvcmRlcj1UKQpgYGAKYGBge3IsIGZpZy53aWR0aD03LCBmaWcuaGVpZ2h0PTZ9CnAgPC0gRG90UGxvdChpcGYzLmZpYi54ZW4sIGZlYXR1cmVzPXVuaXF1ZShjKCdFUENBTScsJ0lUR0I2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ09MMUExJywnQ1RIUkMxJywnUE9TVE4nLCdDT0w4QTEnLCdTQ043QScsJ0lOTVQnLCdSR1M1JywnTVlIMTEnLCdDTk4xJywnU0ZSUDInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQTEEyRzJBJywnTUZBUDUnLCdQSTE2JywnTEdSNScsJ1dOVDVBJywnQ0NOQTEnLCdDQ05CMicsJ0NESzEnLCdDRU5QRicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0tJVCcsJ01LSTY3JywnUENOQScsJ1RPUDJBJywnTFRCUDInLCdDT0w1QTInLCdDT0w4QTEnLCdEUFA2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQVBPRCcsJ01GQVA1JywnRkJOMScsJ0ZHRlI0JywnUENPTENFMicsJ1BER0ZSQScsJ1NGUlAyJywnU1ZFUDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXTlQyJywnTUVEQUcnLCdQSU0xJywnUkFSUkVTMScsJ1RIQlMyJykpCikKcCArIGNvb3JkX2ZsaXAoKSArIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KQpgYGAKYGBge3J9CmlwZjMuZmliLnhlbiA8LSBSZW5hbWVJZGVudHMob2JqZWN0ID0gaXBmMy5maWIueGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAwYCA9ICJTbW9vdGhNdXNjbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxYCA9ICJBbHZlb2xhckZpYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDJgID0gIkZpYnJvdGljRmliX0NUSFJDMWxvdyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDNgID0gIlBlcmljeXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNGAgPSAiTGlwb0ZpYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDVgID0gIlNtb290aE11c2NsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDZgID0gIkFsdmVvbGFyRmliIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgN2AgPSAiRmlicm90aWNGaWJfQ1RIUkMxaGlnaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDlgID0gIlByb2xpZmVyYXRpbmdGaWIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA4YCA9ICJBZHZlbnRpdGlhbEZpYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDEwYCA9ICJBbHZlb2xhckZpYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDExYCA9ICJQZXJpY3l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDEyYCA9ICJBbHZlb2xhckZpYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDEzYCA9ICJBbHZlb2xhckZpYiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCmlwZjMuZmliLnhlbiRuYW1lZF9jbHVzdGVycyA8LSBJZGVudHMoaXBmMy5maWIueGVuKQpEaW1QbG90KGlwZjMuZmliLnhlbiwgbGFiZWw9VCkKYGBgCiMjIE1hcmtlciBsZWFybmluZwpPbiB0aGUgdGhlb3J5IHRoYXQgdGhlcmUgbWlnaHQgYmUgaGlkZGVuIG1hcmtlcnMgb2YgdXRpbGl0eSBpbiB0aGUgWGVuaXVtIHByb2Jlc2V0IHRoYXQgd2UgY291bGQgY28tb3B0IGZvciBuZXh0IGN5Y2xlLgpgYGB7cn0KZmliLm1hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoaXBmMy5maWIueGVuLCBvbmx5LnBvcz1UKQpgYGAKCmBgYHtyfQpmaWIubWFya2VycyAlPiUgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIHNsaWNlX2hlYWQobj0xMCkgJT4lIHVuZ3JvdXAoKSAtPiB0b3AxMAp0b3AxMApgYGAKYGBge3IsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTd9CiMgbWFudWFsbHkgc2F2ZSB0aGlzCnAxIDwtIERvSGVhdG1hcChpcGYzLmZpYi54ZW4sIGZlYXR1cmVzID0gdG9wMTAkZ2VuZSkgKyBOb0xlZ2VuZCgpCmdnc2F2ZSgnZm9yQ2hyaXMtcHJvbGlmZXJhdGlvbi1vbi0wMDIwMjI3X2ZpbGVzL2ZpZ3VyZS1nZm0vbWFya2Vycy1oZWF0bWFwLnBuZycsIHVuaXRzPSdpbicsIHdpZHRoPTksIGhlaWdodD04KQpgYGAKIyMgR2VuZXJhdGUgYXNzaWdubWVudHMgZmlsZSBmb3IgWGVuaXVtIEV4cGxvcmVyCgpGb3IgdmVyc2lvbiAxLjIuMCwgdGhlIGluc3RydWN0b25zIHNheToKCuKAnFZpc3VhbGl6ZSBjdXN0b20gY2VsbHMgZ3JvdXBzIGluIFhlbml1bSBFeHBsb3JlciBieSBpbXBvcnRpbmcgYSBDU1YgZmlsZSBzcGVjaWZ5aW5nIGNlbGwgaWRzIGFuZCBjb3JyZXNwb25kaW5nIGdyb3VwIG5hbWVzLiBCdWlsZCBhIENTViBmaWxlIGNvbnRhaW5pbmcgZWFjaCBjZWxsIGlkIGluIHRoZSBmaXJzdCBjb2x1bW4gYW5kIHRoZSBncm91cCB0aGUgY2VsbCBzaG91bGQgYmUgYXNzaWduZWQgdG8gaW4gdGhlIHNlY29uZCBjb2x1bW4uIEEgY2VsbCBtYXkgb25seSBiZSBhc3NpZ25lZCB0byBvbmUgZ3JvdXAuIE5vdCBhbGwgY2VsbHMgaW4gdGhlIGRhdGFzZXQgbmVlZCB0byBiZSBpbmNsdWRlZC4KCkVuc3VyZSB0aGUgY29sdW1ucyBoYXZlIGhlYWRlcnMgbmFtZWQg4oCcY2VsbF9pZOKAnSBhbmQg4oCcZ3JvdXDigJ0u4oCdCgpUaGlzIGlzIGJhc2ljYWxseSB0aGUgbmFtZWRfY2x1c3RlcnMgbGlzdCB3aXRoIGEgaGVhZGVyIGFuZCBzYXZlZCBhcyBhIENTVi4KCmBgYHtyfQpzY3JhdGNoIDwtIHRpYmJsZShjZWxsX2lkID0gbmFtZXMoaXBmMy5maWIueGVuJG5hbWVkX2NsdXN0ZXJzKSwKICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gaXBmMy5maWIueGVuJG5hbWVkX2NsdXN0ZXJzKQp3cml0ZS5jc3Yoc2NyYXRjaCwgJ1NldXJhdF9maWJfbmFtZWRfY2x1c3RlcnMuY3N2JykKYGBgCg==